#!/bin/bash

# ===========================================================================
# File: "updateAlpha"
#                        Created: 2018-03-07 15:58:19
#              Last modification: 2020-09-20 18:23:38
# Author: Bernard Desgraupes
# e-mail: <bdesgraupes@users.sourceforge.net>
# Copyright (c) 2018-2020 Alpha Cabal
# All rights reserved.
# This file is part of the AlphaCocoa project.
# ===========================================================================

ALF_VERSION="0.1"
ALF_NAME=$(basename $0)

ALF_ALPHA_NAME=Alpha
ALF_DMG_VOLNAME="${ALF_ALPHA_NAME} Installer"
ALF_DEST_DIR=/Applications
ALF_LOG_DIR=~/Library/Logs/Alpha
ALF_LOG_FILE=$ALF_LOG_DIR/updateAlpha.log
ALF_DEBUG=0
ALF_RESTART=0
ALF_ALPHA_PID=0

printusage () {
	echo "Usage:  $ALF_NAME [-d dir] [-r] [-l] [-p pid] distfile"
	echo "        $ALF_NAME [-h|-v]"
	echo "Options:"
	echo "  -d dir     destination dir (default /Applications)"
	echo "  -h         print usage"
	echo "  -l         print out info in log file"
	echo "  -p pid     pid of Alpha"
	echo "  -r         restart or launch after install"
    echo "  -v         print version number"
}

loginfo () {
	if [ $ALF_DEBUG == 1 ] ; then
		echo "$1" >> $ALF_LOG_FILE
	fi
}

# Parse the command line options
while getopts ":d:hlp:rv" opt; do
	case $opt in
		d )
			ALF_DEST_DIR=$OPTARG;;
		h )
			echo alfat $ALFC_CMDNAME "- version $VERSION_NUMBER" 
			echo "Copyright (c) 2018-`date "+%Y"`, Bernard Desgraupes"
			echo "Install a new version of Alpha."
			printusage 
			exit 0 ;;
		l )
			ALF_DEBUG=1
			;;
		p )
			ALF_ALPHA_PID=$OPTARG
			;;
		r )
			ALF_RESTART=1
			;;
		v )
			echo $ALF_VERSION 
			exit 0 ;;
		\? )
			echo "Unknown option."
			printusage
			exit 1 ;;
	esac
done

if [ $ALF_DEBUG == 1 ]  ; then
	if ! [ -e $ALF_LOG_FILE ] ; then
		mkdir $ALF_LOG_DIR
		touch $ALF_LOG_FILE
	fi
fi

loginfo "----------------------------------------------------------------------"
loginfo "`date "+%Y-%m-%d %H:%M:%S"`"
loginfo "call: updateAlpha $*"

# Skip the processed options
shift $((--OPTIND))

if [ $# == 0 ] ; then
	loginfo "missing path to dist file"
	exit 1
fi

if ! [ -e $ALF_DEST_DIR ] ; then
	mkdir -p $ALF_DEST_DIR
	if [ $? != 0 ] ; then
		loginfo "can't create dir $ALF_DEST_DIR"
		exit 1
	fi
fi

ALF_DISTFILE="${!#}"
if ! [ -e $ALF_DISTFILE ] ; then
	loginfo "can't find $ALF_DISTFILE"
	exit 1
fi

ALF_DISTFILE_DMG=`echo $ALF_DISTFILE | sed 's/.zip//'`
ALF_DISTFILE_EXT=${ALF_DISTFILE##*.}
ALF_DISTDIR=$(dirname $ALF_DISTFILE)

cd $ALF_DISTDIR

# Make sure that Alpha.app is not running
ALF_ALPHA_PROCESS=`ps -x -o command | grep "^$ALF_DEST_DIR/Alpha.app/Contents/MacOS/Alpha\$"`
if [ "$ALF_ALPHA_PROCESS" != "" ] ; then
	# Alpha still running
	if [ $ALF_ALPHA_PID != 0 ] ; then
		kill -9 $ALF_ALPHA_PID
		loginfo "killed process $ALF_ALPHA_PROCESS ($ALF_ALPHA_PID)"
	else
		loginfo "can't install while $ALF_DEST_DIR/Alpha.app is running"
		exit 1		
	fi
else
	loginfo "checked Alpha.app not running"
fi

# Unzip the file
if [ "$ALF_DISTFILE_EXT" == "zip" ] ; then
	loginfo "unzipping $ALF_DISTFILE..."
	unzip -o $ALF_DISTFILE
	if [ $? != 0 ] ; then
		exit 1
	fi
	loginfo "...done"
fi

# Mount the disk image.
# The -nobrowse option makes the volume invisible in the Finder.
loginfo "mounting $ALF_DISTFILE_DMG..."
hdiutil attach -readonly -nobrowse $ALF_DISTFILE_DMG
if [ $? != 0 ] ; then
	loginfo "failed to attach the disk image"
	exit 1
fi
loginfo "...done"

# Copy Alpha to the destination folder
if ! [ -e "/Volumes/$ALF_DMG_VOLNAME/Alpha.app" ] ; then
	loginfo "can't find Alpha.app in disk image"
	exit 1
fi
if [ -e "$ALF_DEST_DIR/Alpha.app" ] ; then
	loginfo "removing existing Alpha.app in $ALF_DEST_DIR..."
	cd "$ALF_DEST_DIR/Alpha.app"
	rm -rf *
	cd "$ALF_DEST_DIR"
	rmdir "Alpha.app"
	loginfo "...done"
fi
loginfo "copying Alpha.app to $ALF_DEST_DIR..."
cd "/Volumes/$ALF_DMG_VOLNAME"
cp -pRf Alpha.app $ALF_DEST_DIR
if [ $? != 0 ] ; then
	loginfo "copy of Alpha.app failed"
	exit 1
fi
loginfo "...done"

# Back to the dist dir
cd $ALF_DISTDIR

# Unmount the dmg
ALF_DEV_NAMES=$(hdiutil info | grep '^/dev/' | grep "$ALF_DMG_VOLNAME" | awk '{print $1}')
if [ "$ALF_DEV_NAMES" != "" ] ; then
	for dev in $ALF_DEV_NAMES; do
		loginfo "unmounting $dev..."
		hdiutil detach "$dev"
		if [ $? != 0 ] ; then
			loginfo "detaching $dev failed"
		else
			loginfo "...done"
		fi
	done
fi

# Restart Alpha
if [ $ALF_RESTART == 1 ] ; then
	# Check if the app has been quarantined
	xattr -p com.apple.quarantine "$ALF_DEST_DIR/Alpha.app"
	if [ $? != 0 ] ; then
		loginfo "removing quarantine extended attribute..."
		xattr -dr com.apple.quarantine "$ALF_DEST_DIR/Alpha.app"
	fi
	loginfo "launching $ALF_DEST_DIR/Alpha.app..."
	open "$ALF_DEST_DIR/Alpha.app"
	if [ $? != 0 ] ; then
		loginfo "launching $ALF_DEST_DIR/Alpha.app failed"
		exit 1
	fi
	loginfo "...done"
fi
loginfo "installation ended: `date "+%Y-%m-%d %H:%M:%S"`"


exit 0
